// internal/parser/parser/create.go
package parser

import (
	"NumberBase/internal/parser/ast"
	"NumberBase/internal/parser/lexer"
	"fmt"
)

// parseCreateTableStatement 解析CREATE TABLE语句
// 例如: CREATE TABLE users (id INT PRIMARY KEY, name VARCHAR NOT NULL)
func (p *Parser) parseCreateTableStatement() (*ast.CreateTableStatement, error) {
	stmt := &ast.CreateTableStatement{}

	// 跳过CREATE TABLE
	p.nextToken() // 跳过CREATE
	p.nextToken() // 跳过TABLE

	// 解析表名
	if !p.currTokenIs(lexer.IDENTIFIER) {
		return nil, fmt.Errorf("期望表名，但得到%s", p.currToken.Literal)
	}
	stmt.TableName = p.currToken.Literal

	// 期望下一个Token是左括号
	if !p.expectPeek(lexer.LPAREN) {
		return nil, fmt.Errorf("期望(，但得到%s", p.peekToken.Literal)
	}

	// 解析列定义
	columns, err := p.parseColumnDefinitions()
	if err != nil {
		return nil, err
	}
	stmt.Columns = columns

	// 期望当前Token是右括号
	if !p.currTokenIs(lexer.RPAREN) {
		return nil, fmt.Errorf("期望)，但得到%s", p.currToken.Literal)
	}

	// 检查下一个token是否是分号(作为SQL语句结束标记)
	if p.peekTokenIs(lexer.SEMICOLON) {
		p.nextToken() // 消费分号，确认语句结束
	}
	// 如果没有分号，也允许语句结束（某些SQL环境中分号是可选的）

	return stmt, nil
}

// parseColumnDefinitions 解析列定义列表
func (p *Parser) parseColumnDefinitions() ([]ast.ColumnDefinition, error) {
	columns := []ast.ColumnDefinition{}

	// 跳过左括号
	p.nextToken()

	for !p.currTokenIs(lexer.RPAREN) && !p.currTokenIs(lexer.EOF) {
		// 解析列名
		if !p.currTokenIs(lexer.IDENTIFIER) {
			return nil, fmt.Errorf("期望列名，但得到%s", p.currToken.Literal)
		}
		colName := p.currToken.Literal

		// 解析列类型
		p.nextToken()
		if !p.currTokenIs(lexer.IDENTIFIER) && !p.currTokenIs(lexer.INT) && !p.currTokenIs(lexer.VARCHAR) {
			return nil, fmt.Errorf("期望列类型，但得到%s", p.currToken.Literal)
		}
		colType := p.currToken.Literal

		// 创建列定义
		col := ast.ColumnDefinition{
			Name: colName,
			Type: colType,
		}

		// 解析列约束(可选)
		p.nextToken()
		for p.currTokenIs(lexer.PRIMARY) || p.currTokenIs(lexer.NOT) {
			if p.currTokenIs(lexer.PRIMARY) {
				p.nextToken() // 跳过PRIMARY
				if !p.currTokenIs(lexer.KEY) {
					return nil, fmt.Errorf("期望KEY，但得到%s", p.currToken.Literal)
				}
				col.PrimaryKey = true
				p.nextToken() // 跳过KEY
			} else if p.currTokenIs(lexer.NOT) {
				p.nextToken() // 跳过NOT
				if !p.currTokenIs(lexer.NULL) {
					return nil, fmt.Errorf("期望NULL，但得到%s", p.currToken.Literal)
				}
				col.NotNull = true
				p.nextToken() // 跳过NULL
			}
		}

		columns = append(columns, col)

		// 如果当前Token是逗号，跳过并继续解析下一列
		if p.currTokenIs(lexer.COMMA) {
			p.nextToken()
		}
	}

	return columns, nil
}
